<?php
class Modele {
	/**
	 *
	 * Modele g�n�ral du MVC qui sera h�rit� par tous les mod�les -> Requetes sql en PDO
	 * @var unknown_type
	 */
	public $conf = 'default';
	static $connections = array();
	public $table = false;
	public $db;
	public $primaryKey = 'id';
	public $id;
	public $errors = array();
	public $form;
	static $cactus = '';

	public function __construct() {
		$this -> db = new DOMDocument();
		$file = Conf::$database;
		if (file_exists($file)) {
			$this -> db -> load($file);
		}
	}

	/**
	 *
	 * fonction permettant en fonction du tableau pass� en param�tre d'executer une requete de recherche dans un tableau
	 * @param $req contient les champs � afficher ainsi que les conditions et les informations supplementairs � utiliser dans la requete
	 */
	public function find($req) {
		$comptes = $this -> db -> getElementsByTagName('compte');
		foreach ($comptes as $compte) {
			if ($compte -> getElementsByTagName('login') -> item(0) -> nodeValue == $req['login'] && $compte -> getElementsByTagName('password') -> item(0) -> nodeValue == $req['password']) {
				foreach ($compte -> getElementsByTagName('cactus') as $cactus) {
					$this -> cactus = $cactus -> getElementsByTagName('nom') -> item(0) -> nodeValue;
				}
				return array('cactus' => $this -> cactus);
			}
		}
		return null;
	}

	/**
	 *
	 * Permet de faire une mise � jour et m�me un ajout dans une table
	 * @param $data tableau contenant toutes les informations sur chaque champs � enregistrer
	 * @param $insert permet de savoir s'il s'agit d'un ajout ou d'un update
	 */

	public function save($data, $insert) {
		$comptes = $this -> db -> getElementsByTagName('comptes') -> item(0);
		$compte = $this -> db -> getElementsByTagName('compte') -> item(0);
		$nouveauCompte = $compte -> cloneNode(true);
		$comptes -> appendChild($nouveauCompte);
		$nouveauCompte -> getElementsByTagName('numcpt') -> item(0) -> nodeValue = $data['numcpt'];
		$nouveauCompte -> getElementsByTagName('login') -> item(0) -> nodeValue = $data['pseudo'];
		$nouveauCompte -> getElementsByTagName('password') -> item(0) -> nodeValue = $data['mdp'];
		$nouveauCompte -> getElementsByTagName('email') -> item(0) -> nodeValue = $data['mailclient'];
		$this -> db -> save(Conf::$database);
	}

	/**
	 * Fonction qui calcule l'id d'un compte en cours de création
	 * @return l'id calculé en fonction du nombre de comptes présent dans le fichier XML
	 */
	public function generateNewId() {
		$id = 0;
		$comptes = $this -> db -> getElementsByTagName('compte');
		foreach ($comptes as $compte) {
			$id++;
		}
		$id++;
		return $id;
	}

	/**
	 *
	 * V�rification des erreurs possibles dans le formulaires
	 * @param  $data tableau contenant chaque champs remplis par l'utilisateur
	 */
	function validates($data, $var = null) {
		$errors = array();
		//tableau contenant les erreurs
		$regle = $this -> validate;
		//regle contenu dans la variable validate du modele
		/*	if(!empty($var))
		 $regle=$this->$var;*/

		foreach ($regle as $k => $v)//parcours du tableau des r�gles
		{
			//v�rification de chaque cas et s'il n'est pas respect� on met les messages d'erreurs dans un tableau errors
			if (!isset($data -> $k)) {
				$errors[$k] = $v['message'];
			} else {//test pour savoir si le champ est vide
				if ($v['rule'] == 'notEmpty') {
					if (empty($data -> $k)) {
						$errors[$k] = $v['message'];
					}

				}
				//test pour savoir si un champ est identique � un autre cas des mails ou mot de passe
				if ($v['rule'] == 'notSame') {
					if ($data -> $k != $data -> $v['compare']) {
						$errors[$k] = $v['message'];
					}

				}

				//savoir si une case a �t� cocher dans le cas de s�lection
				if ($v['rule'] == 'notNull') {
					if ($data -> $k == 0) {
						$errors[$k] = $v['message'];
					}
				}

				//savoir si le champ n'est pas d�j� pr�sent dans la base de donn�e dans le cas de champ d'identification
				if ($v['rule'] == 'notExist') {$exist = $this -> findFirst(array('conditions' => array($k => $data -> $k)));
					if (empty($data -> $k) || !empty($exist)) {
						$errors[$k] = $v['message'];
					}

				}

				//test surtout pour savoir si des mails entr�s sont valides avec chainechar@chainechar.chainechar
				if ($v['rule'] == 'notValid') {
					if (empty($data -> $k) || !$this -> VerifMail($data -> $k)) {
						$errors[$k] = $v['message'];
					}
				}

				//savoir si un champ est totalement num�rique
				if ($v['rule'] == 'notVarchar') {
					if (empty($data -> $k) || !is_numeric($data -> $k)) {
						$errors[$k] = $v['message'];
					}
				}

				//savoir si un champ contient uniquement des caract�res
				if ($v['rule'] == 'notNumeric') {
					if (!empty($data -> $k)) {
						$i = 0;
						$lettre = "a";
						while ($i < strlen($data -> $k) && !is_numeric($lettre)) {
							$lettre = substr($data -> $k, $i, 1);
							$i++;
						}

						if ($i != strlen($data -> $k))
							$errors[$k] = $v['message'];
					} else
						$errors[$k] = $v['message'];

				}
			}
		}
		$this -> errors = $errors;
		if (isset($this -> Form)) {
			$this -> Form -> errors = $errors;
			//envoi du tableau errors au formulaire pour mettre les erreurs � c�t� des champs concern�s
		}
		if (empty($errors)) {
			return true;
		}
		return false;

	}

	public function VerifMail($adresse) {
		$chaine = '#^[\w.-]+@[\w.-]+\.[a-zA-Z]{2,6}$#';
		if (preg_match($chaine, $adresse)) {
			return true;
		} else
			return false;
	}

}
?>